{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# default_exp callback.MVP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# MVP (aka TSBERT) - Self-Supervised Pretraining of Time Series Models\n",
    "\n",
    "> Masked Value Predictor callback used to predict time series step values after a binary mask has been applied.\n",
    "\n",
    "This is an unofficial PyTorch implementation created by Ignacio Oguiza (timeseriesAI@gmail.com) based on:\n",
    "\n",
    "* Zerveas, G., Jayaraman, S., Patel, D., Bhamidipaty, A., & Eickhoff, C. (2020). [A Transformer-based Framework for Multivariate Time Series Representation Learning. arXiv preprint arXiv:2010.02803v2.](https://arxiv.org/pdf/2010.02803). No official implementation available as far as I know (Oct 10th, 2020)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "from tsai.imports import *\n",
    "from fastai.callback.all import *\n",
    "from tsai.utils import *\n",
    "from tsai.models.utils import *\n",
    "from tsai.models.layers import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "from torch.distributions.beta import Beta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "from torch.distributions.geometric import Geometric\n",
    "from torch.distributions.binomial import Binomial\n",
    "\n",
    "def create_subsequence_mask(o, r=.15, lm=3, stateful=True, sync=False):\n",
    "    if r <= 0: return torch.zeros_like(o).bool()\n",
    "    device = o.device\n",
    "    if o.ndim == 2: o = o[None]\n",
    "    n_masks, mask_dims, mask_len = o.shape\n",
    "    if sync == 'random': sync = random.random() > .5\n",
    "    dims = 1 if sync else mask_dims\n",
    "    if stateful: \n",
    "        numels = n_masks * dims * mask_len\n",
    "        pm = torch.tensor([1 / lm], device=device)\n",
    "        pu = torch.clip(pm * (r / max(1e-6, 1 - r)), 1e-3, 1)\n",
    "        zot, proba_a, proba_b = (torch.as_tensor([False, True], device=device), pu, pm) if random.random() > pm else \\\n",
    "        (torch.as_tensor([True, False], device=device), pm, pu)\n",
    "        max_len = max(1, 2 * math.ceil(numels // (1/pm + 1/pu)))\n",
    "        for i in range(10):\n",
    "            _dist_a = (Geometric(probs=proba_a).sample([max_len])+1).long()\n",
    "            _dist_b = (Geometric(probs=proba_b).sample([max_len])+1).long()\n",
    "            dist_a = _dist_a if i == 0 else torch.cat((dist_a, _dist_a), dim=0)\n",
    "            dist_b = _dist_b if i == 0 else torch.cat((dist_b, _dist_b), dim=0)\n",
    "            add = torch.add(dist_a, dist_b)\n",
    "            if torch.gt(torch.sum(add), numels): break\n",
    "        dist_len = torch.argmax((torch.cumsum(add, 0) >= numels).float()) + 1\n",
    "        if dist_len%2: dist_len += 1\n",
    "        repeats = torch.cat((dist_a[:dist_len], dist_b[:dist_len]), -1).flatten()\n",
    "        zot = zot.repeat(dist_len)\n",
    "        mask = torch.repeat_interleave(zot, repeats)[:numels].reshape(n_masks, dims, mask_len)\n",
    "    else: \n",
    "        probs = torch.tensor(r, device=device)\n",
    "        mask = Binomial(1, probs).sample((n_masks, dims, mask_len)).bool()\n",
    "    if sync: mask = mask.repeat(1, mask_dims, 1)\n",
    "    return mask\n",
    "\n",
    "def create_variable_mask(o, r=.15):\n",
    "    if r <= 0: return torch.zeros_like(o).bool()\n",
    "    device = o.device\n",
    "    n_masks, mask_dims, mask_len = o.shape\n",
    "    _mask = torch.zeros((n_masks * mask_dims, mask_len), device=device)\n",
    "    if int(mask_dims * r) > 0:\n",
    "        n_masked_vars = int(n_masks * mask_dims * r)\n",
    "        p = torch.tensor([1./(n_masks * mask_dims)], device=device).repeat([n_masks * mask_dims])\n",
    "        sel_dims = p.multinomial(num_samples=n_masked_vars, replacement=False)\n",
    "        _mask[sel_dims] = 1\n",
    "    mask = _mask.reshape(*o.shape).bool()\n",
    "    return mask\n",
    "\n",
    "def create_future_mask(o, r=.15, sync=False):\n",
    "    if r <= 0: return torch.zeros_like(o).bool()\n",
    "    if o.ndim == 2: o = o[None]\n",
    "    n_masks, mask_dims, mask_len = o.shape\n",
    "    if sync == 'random': sync = random.random() > .5\n",
    "    dims = 1 if sync else mask_dims\n",
    "    probs = torch.tensor(r, device=o.device)\n",
    "    mask = Binomial(1, probs).sample((n_masks, dims, mask_len))\n",
    "    if sync: mask = mask.repeat(1, mask_dims, 1)\n",
    "    mask = torch.sort(mask,dim=-1, descending=True)[0].bool()\n",
    "    return mask\n",
    "\n",
    "def natural_mask(o): \n",
    "    \"\"\"Applies natural missingness in a batch to non-nan values in the next sample\"\"\"\n",
    "    mask1 = torch.isnan(o)\n",
    "    mask2 = rotate_axis0(mask1)\n",
    "    return torch.logical_and(mask2, ~mask1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/nacho/opt/anaconda3/envs/py38/lib/python3.8/site-packages/torch/_tensor.py:579: UserWarning: floor_divide is deprecated, and will be removed in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values.\n",
      "To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor'). (Triggered internally at  ../aten/src/ATen/native/BinaryOps.cpp:467.)\n",
      "  return torch.floor_divide(other, self)\n"
     ]
    }
   ],
   "source": [
    "t = torch.rand(16, 3, 100)\n",
    "mask = create_subsequence_mask(t, sync=False)\n",
    "test_eq(mask.shape, t.shape)\n",
    "mask = create_subsequence_mask(t, sync=True)\n",
    "test_eq(mask.shape, t.shape)\n",
    "mask = create_variable_mask(t)\n",
    "test_eq(mask.shape, t.shape)\n",
    "mask = create_future_mask(t)\n",
    "test_eq(mask.shape, t.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "o = torch.randn(2, 3, 4)\n",
    "o[o>.5] = np.nan\n",
    "test_eq(torch.isnan(natural_mask(o)).sum(), 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAADSCAYAAAB5ENV1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAfP0lEQVR4nO3de7gkVXnv8e8PBuR+k3EcLgMqoEGMICPiAZQIQUEMaHJQVESDDkQ5goccRXISQcSDHhXx0UMyCAEEQcJNJBhFxCBHQBkuCgwK4iAMwwz3u+jAmz/W2lA03Xt37+7Vu6r37/M8+9ndVdVVb6269Nur1qpSRGBmZmZmg7XCVAdgZmZmNoqcZJmZmZkV4CTLzMzMrAAnWWZmZmYFOMkyMzMzK8BJlpmZmVkBTrKsL5JOkfS5qY6jE0lHSjp9quOYjnote0lvlXRBwZCmhKSdJd3V5zxmSVoo6UUDjGtTSSFpRpfTf07SfZLuGcCyQ9Jm/c7HrO6cZNmUkXS0pF9JWi7pyKmOx6bcMcCxUx3EeCR9UNLTkh6r/H299HIjYilwGTCv9LLakTQHOAzYMiJeOuB51/qHWi8krSfpfEmPS7pD0nvHmfYvJF0m6WFJizpMc4ik3+X5LZS0RWXce/MyHpd0gaT1CqyS9clJlk2l24BPAv8+1YHY1JL0emDtiLhqqmPpwpURsUbl7+AhLfcM4MAhLavVHOD+iFg2Rctvim8AfwRmAe8DTpD06g7TPg6cDPyvdiMlfRg4AHg7sAawJ3BfHvdq4F+A/fKyngD+38DWwgbGSVaDSfqUpMWSHpX0a0m75OHbSbpS0kOSlkj6uqSVK58LSR+VdGv+7NGSXiHpZ5IekXT22PRjlzokHZEvFSyS9L5xYtpT0vV52T+T9Oedpo2IUyPi+8CjXazrdpKuyfEtlfSVanwt0y6StGtl0CqSvpPX9VpJr+2iDFeQdLik30q6P5fJepXP7Zd/Rd4v6R+qy2z9Zd4ao6QNJJ0r6d78K/XjlXFH5mWdlmO6SdLcyviNJZ2XP3t/tRZF0t/mX7sPSvqBpE06lOXYZaIPSbozT3+QpNdL+mXedtX5vkLSj/Py7pN0hqR1JirDlmWuJOnMvN4rt44Hdgf+szK9JB0naVne5r+StFWOcamkFSvTvkvSDf2WXz9yWS7My7xdUsdkaLL7HHA18PJO27WLGFeU9KW8DW8nfXlXx68t6SSlc8ZipcuDK+b9+hJgA6Wau1Py9P8m6R6lmpjLVUkmJP1EKUkYe/9BSVe0iWkeKRn5ZJ739zrE3vU5K0/f8TxUKeNHJd0s6Z2tceZyelDp+Ny9y/JdHfhr4B8j4rGIuAK4kJQIvUBE/DwivgXc3mZeKwCfAT4RETdH8tuIeCBP8j7gexFxeUQ8Bvwj8C5Ja3YTqw2Pk6yGkvRK4GDg9RGxJvBWYFEe/TTwCWB94I3ALsBHW2bxVmBbYHtSbdJ84P3AxsBWwL6VaV+a57UhsD8wPy+/NaZtSL/MDgReTPqldaEG047keOD4iFgLeAVwdg+f3Qv4N2A94NvABflLf7wy/B/A3sCbgQ2AB0m/UpG0JXAC6eS5AWldN+omkHzy/B5wA6k8dwEOlfTWymR/BZwFrEM6SX89f3ZF4CLgDmDT/Pmz8ri9gCOAdwEzgZ8CZ04QzhuAzYF3A18F/gHYFXg1sI+kN4+FDfyfvK5/RtpHjszLHa8Mx9Z5VeAC4Clgn4j4Y5tYXgP8uvJ+N+BNwBbA2sA+pJqUXwD35/Fj9gNOq7yfTPntmL+QO/3t2L4In7WMVNOwFvAh4DhJr2udaLL7HEBELCfV/r6WyflIjnEbYC7wNy3jTwGWA5vlaXYDPhwRPyIlwXfnmrsP5um/T9p/XgJcS6pp60lEzM+f+2Ke9zvGmbyrc1YX56HfAjuR9qujgNMlza4s5w2kfXF94IvASZKU5324pIs6xLcFsDwiflMZdgPpeOrVRvlvK6UfQr+TdFQ+f5DnecPYxBHxW1IN2hYvnJVNqYjwXwP/SCfCZaQvxZUmmPZQ4PzK+wB2qLxfAHyq8v7LwFfz651JJ97VK+PPJv1ag3Ri/lx+fQJwdMuyfw28eYL4TgeOnGCay0knxPVbhu8M3NUybBGwa359JHBVZdwKwBLSSbZjGQILgV0q72cDfwJmAP8EnFUZtzrpBDe2zGfLpDVG0gn89y3L+jTwr5V4f1QZtyXwZH79RuBeYEab8vk+cEDLej4BbNJm2k3zPrBhZdj9wLsr788FDu2wLfYGrptoP8zrciGphuprgMbZvpcAB1XevwX4DekLdYWWaT8FnJFfr5fXc3Y/5dfDcfdB0vHwUOVv+zbTXQAc0mb7T2qfqwz7/8AHJhn7j1vKeLe8H8wgXXJ6Cli1Mn5f4LJOx1nLvNfJ81o7v/8JKUGrltsVlfcBbNbueOkw/17OWT2dh4Drgb0qcd5WGbdaXvZLuyjfnYB7WoZ9BPjJBJ/bFVjUMuy/5eX+ey7bTUnHw0fy+Eur2zIPWwzsPNl9239l/lyT1VARcRspeToSWCbpLEkbAEjaQtJFuSr/EeDzpF9lVUsrr59s836NyvsHI+Lxyvs7SL+0W20CHFatASD9ymw3ba8OIP1Ku0XSLyTt2cNn7xx7ERHPAHcBG4xXhqR1Ob+yHgtJNYSzSOtTnefjpCSlG5uQLrtUy+iIPN8x1d5bT5Aud84gleUdkWo02s33+Mo8HyDVQG04Tixd7QNKPdvOypeQHiElxevD+Pthtj3w58Cxkb8JOngQePZSR0T8mFQD9Y083/mS1sqjTwfekS/P7AP8NCKWVOY1mfLrxVURsU7l7ypJu0u6StIDufz34IXH3ETlNd4+N2ZNUmL3PJLmqNIYv0Pcz9tvScfxmE2AlYAlleX/C6mW6gWULiMemy+7PcJztXEvWOcB6vacNe55SNIHKpcSHyLVglXjfnb/iYgn8svq+bCTx0g1mVVr0UVziDaezP+/GBEPRcQi0vbYo8CyrCAnWQ0WEd+OiB1JJ5UAvpBHnQDcAmwe6fLaEaQv3MlaN3+hjZkD3N1mujuBY1q+gFaLiIkuW00oIm6NiH1JJ/0vAOfkmB4n/doEnr0kNLPl4xtXxq9Aqoa/O8+3UxneCezesi6rRMRiUk1YdZ6rkS5LjHleTKTLrWPuBH7XMt81I2IPJnYnMEftu9zfCRzYMt9VI+JnXcx3Ip8nlc1r8v70fir70zhlCPBD0qXGSyVVk4VWv6TlUkdEfC0itiXVRm1BbiCct8GVpEuj+wHf6nI9OpafpJ30/B6DrX87dZppvgx1LvAlYFZErANcTIdjbpL7HDnuzahcJqrM8/dRaYzfIdTn7bek47haNk+RaorHlr1WRHS61PVe0mX4XUmX3TYdK478f7xj4AXhjzNuMjqeh5Tas51IumT74rytbqS/8+OY3wAzJG1eGfZa4KZJzOvXpNrxatlUX99E5bKxpJcDL8oxWI04yWooSa+U9JZ8gv8D6ZfPM3n0msAjwGOSXgX83QAWeZSklfOXzZ6kNk6tTgQOkvQGJatLers6NMZUahe1Cmk/nCFpFVUaNLdM+35JM3NN1EN58DOkk8oqeTkrAf+bdLKp2lapcfQMUi3CU8BVE5ThPwPH5JMykmYqtXsCOAfYU6kdz8rAZ3n+sXQ9sIdSd+6X5mWO+TnwqFLj51VzjcBWSr3rJvJz0hflsblsV5G0QyXeTys3PlZqxPzfu5hnN9Yk/XJ+WNKGVHpDTVCGAETEF0lt4S6V1Kmm42JSW6Sx+b4+70crkb6w/9Ay39NI7XJeA5zX5Xp0LL+I+Gk8v8dg699Px5nvyqR97l5guVJD6d3aTdjHPgewHemy0h1MztnAxyVtJGld4PCxEbkm8IfAlyWtpdQI/xV6rl1eqzVJx9H9pGTq8y3jryc1xF5N6X5YB4wT11Lg5ZNao/bGOw+tTkpW7oXUYYFUk9W3XKN9HvDZvMwdSIlo2x8BuYxXIdUgKu+PK+d5PQF8h9QhYE1JG5Fu3zHWHuwMUm3uTvnH5meB8yLCNVk14ySruV5EuqfQfaTq7ZeQ2vYA/D3pl+ajpBPOd/pc1j2kyzl3kw7ugyLiltaJIuIaUhuEr+fpbyO1cejkRNKXzL6kRtdP0qEnDvA24CalSyHHA++JiCcj4mFSo/5vktokPE66HFj1XVLj7gfz/N8VEX9i/DI8ntSe6IeSHgWuIrWnIiJuAj5GShyW5PlWl/ktUm3DItIX17PlHxFPk5LUrYHf5WV/k1QbMK782XeQajN+n5f57jzufFKNyFn58s2NpMbKg3AU8DrgYVIbkWpSM14ZVmM/mtRO6Udqcz+fiLiWlMS9IQ9ai7R/PEi6rHU/8H8rHzmffHmtcklnXOOVXz/yF9vHSUnMg6Rj78IOk09qn8veR0rEJutE4AekffNaXpicfoCUMN6c1+McUruwdk4jbZfFefrWW28cR6qJWQqcyviN4k8CtsyX7y7ocl06Gu88FBE3k9pvXZljew2pnVtXlHpZf3+cST4KrEpqd3cm8Hf5fPFsbWll2jeRznkXk2oVnySdL8YcTPpxc3eO99ukBv1j56CDSOW6jJT0tnZushrQ+M0kbLqTtDNwekR01XtuulK6meBYTyybBEm7AR+NiL27nP63pEukI1/mkl5C6kCwTUT8YarjMbPudPU4BTOz0iLihzz/l3xHkv6adNnnx0WDqolINwH9s6mOw8x6M2GSla8ZX06q5p4BnBMRn5H0MtI9Zl5M6k67X7S//42Z2cBI+gmpMfx+uY2emVktTXi5UJJI90h6LDdCvQI4BPifpIZ2Z0n6Z+CGiDiheMRmZmZmDTBhw/dIxhrrrZT/gnSzwHPy8FNJNyg0MzMzM7rsXZi7mV9P6sVwCemxBA9Vbup3F+Pf9NDMzMxsWumq4Xvu+ry10kNhzwde1e0ClB4AOg9gdVbf9lVdfnTBtt0uoTfbLuh/HoOIbdhxtFteqTI260Uvx0LJfbYOx0insvCxOr0N4vtiOhrIcbNgwX0R0XqD6671fAsHSf9Eup/Hp0jPc1ou6Y2kZ8+9dbzPztXcuIZrugysp7C6FgO4r+8gYht2HO2WV6qMzXrRy7FQcp+twzHSqSx8rE5vg/i+mI4GctxICyJi7mQ/PuHlwnzX4XXy61WBvyQ9U+synnuK+/6kGz6amZmZGd1dLpwNnJofd7ICcHZEXCTpZtLdpT8HXEe6a6+ZmZmZ0UWSFRG/BLZpM/x20rO0zMzMzKzFUO/4vmBbUJsmWe2uN5dqmzDs9lSdlleHNha9XuevQ8w2euqyX9UhDrcBs3ZGpY1yXdpfDpMfEG1mZmZWgJMsMzMzswKcZJmZmZkV4CTLzMzMrAAnWWZmZmYFDLV3YSdN60XQKd4635W3zmVcqtxK9XrpdXnTsUeNNUOd97cmHjd1eGpAL+oSW13iKME1WWZmZmYFOMkyMzMzK8BJlpmZmVkBTrLMzMzMCqhFw/dRMcqN90pqV26DaIhel44Io7JfDLshcl22X7fqvJ2H/fiUQahzeXZSh5jr3GGgDuUzbK7JMjMzMyvASZaZmZlZAU6yzMzMzApwkmVmZmZWgBu+Wy2VbCBZh0bAdYhhEMvrtB51uIu/PcflVj+djpFhbqs6xNCrpp07XZNlZmZmVsCESZakjSVdJulmSTdJOiQPP1LSYknX5789yodrZmZm1gzdXC5cDhwWEddKWhNYIOmSPO64iPhSufDMzMzMmmnCJCsilgBL8utHJS0ENiwdmJmZmVmT9dQmS9KmwDbA1XnQwZJ+KelkSesOOjgzMzOzplJEd83sJa0B/CdwTEScJ2kWcB8QwNHA7Ij42zafmwfMA2DOnG25444BhW5mo6zOjweZjuqyPerwuCXvb9OItCAi5k72413VZElaCTgXOCMizgOIiKUR8XREPAOcCGzX7rMRMT8i5kbEXGbOnGycZmZmZo3STe9CAScBCyPiK5XhsyuTvRO4cfDhmZmZmTVTN70LdwD2A34l6fo87AhgX0lbky4XLgIOLBCfmZmZWSN107vwCqDdVfCLBx+OmZmZ2WjwY3XMBmQQj6ioS+PiOhj19Wu3rYe9zk17REmvyyvVSL6Jj6Opszp0Zuik39D8WB0zMzOzApxkmZmZmRXgJMvMzMysACdZZmZmZgU4yTIzMzMrwL0LJ8E9SwZr2D1LSm2nQczX+9D0UYdtXYcYShr19RsVtd5OfX4/uSbLzMzMrAAnWWZmZmYFOMkyMzMzK8BJlpmZmVkBtWj43rRHidQhhlEyiPKswyNKOmna/t1EdeiMUjKGUvt3qU4ndX48kI+x0dTvvlxqv3BNlpmZmVkBTrLMzMzMCnCSZWZmZlaAkywzMzOzApxkmZmZmRVQi96Fde7t4V4rU6PXnlp1Lvs6xzYqeinjYT/GaRC9Duv8KKg6GJX1sMnrdx/oeJz2N1vXZJmZmZmVMGGSJWljSZdJulnSTZIOycPXk3SJpFvz/3XLh2tmZmbWDN3UZC0HDouILYHtgY9J2hI4HLg0IjYHLs3vzczMzIwukqyIWBIR1+bXjwILgQ2BvYBT82SnAnsXitHMzMyscXpq+C5pU2Ab4GpgVkQsyaPuAWZ1+Mw8YB4Ac+ZMNs7iSjVwH3Yj206a1jC0afFac3jfGj117qBUh0c+2cQ6bo8+v8O7bvguaQ3gXODQiHikOi4iAmgbYkTMj4i5ETGXmTP7CtbMzMysKbpKsiStREqwzoiI8/LgpZJm5/GzgWVlQjQzMzNrnm56Fwo4CVgYEV+pjLoQ2D+/3h/47uDDMzMzM2umbtpk7QDsB/xK0vV52BHAscDZkg4A7gD2KRKhmZmZWQNNmGRFxBV0bvq1y2DDMTMzMxsNtXisTh16hnSab7vYSvUYdG+T+qlL79B+ed+yUVbn/XsQsY3KeagXdd6mvfBjdczMzMwKcJJlZmZmVoCTLDMzM7MCnGSZmZmZFTDUhu/bLoBr+mzAN+xG8k1rfOdHOAyWy236GHbjYu9b1i3vK83lmiwzMzOzApxkmZmZmRXgJMvMzMysACdZZmZmZgUMteH7gm1B17xweLsGp3W+S26pRoiDiNcNJIejDk8psMFqt53ckcSsvDrf0b7f0FyTZWZmZlaAkywzMzOzApxkmZmZmRXgJMvMzMysACdZZmZmZgUMtXdhJ7306hlmDMNWhxjAPee6Uef17vfYqUvP3jqUcR1isOYYRE/56Xj+rfV69Hkuc02WmZmZWQETJlmSTpa0TNKNlWFHSlos6fr8t0fZMM3MzMyapZuarFOAt7UZflxEbJ3/Lh5sWGZmZmbNNmGSFRGXAw8MIRYzMzOzkdFPw/eDJX0AuAY4LCIebDeRpHnAPADmzOl65nVuCFfnRwD0olMZ17nsR0XJhuF12H51iMFs2Aax39f5sW3tDDvepp1bJtvw/QTgFcDWwBLgy50mjIj5ETE3IuYyc+YkF2dmZmbWLJNKsiJiaUQ8HRHPACcC2w02LDMzM7Nmm1SSJWl25e07gRs7TWtmZmY2HU3YJkvSmcDOwPqS7gI+A+wsaWsggEXAgeVCNDMzM2ueCZOsiNi3zeCTCsRiZmZmNjJq8Vidpumld0PJnohN62Vhz/G2q59BPBLFJsdlX17TyrNp8Xbix+qYmZmZFeAky8zMzKwAJ1lmZmZmBTjJMjMzMyvADd8LG5XGe2ajrt9jtS6P22riOaeJMTeNOxdMDddkmZmZmRXgJMvMzMysACdZZmZmZgU4yTIzMzMrwEmWmZmZWQHuXWhmjVeHnn3uqWWldNq/e9nnvH9ODddkmZmZmRXgJMvMzMysACdZZmZmZgU4yTIzMzMrwA3fs1INZ93Y0GxyenkMiI+zqTPsx7VMx04O3r+byzVZZmZmZgVMmGRJOlnSMkk3VoatJ+kSSbfm/+uWDdPMzMysWbqpyToFeFvLsMOBSyNic+DS/N7MzMzMsgmTrIi4HHigZfBewKn59anA3oMNy8zMzKzZJtvwfVZELMmv7wFmdZpQ0jxgHgBz5rSdpg4NGUsZ5XWrEzcMHd+w98NBbI9BzMMdWsoblUbgg7irulmrvhu+R0QAHXfDiJgfEXMjYi4zZ/a7ODMzM7NGmGyStVTSbID8f9ngQjIzMzNrvskmWRcC++fX+wPfHUw4ZmZmZqOhm1s4nAlcCbxS0l2SDgCOBf5S0q3Arvm9mZmZmWUTNnyPiH07jNplwLGYmZmZjYxaPFanXe+NUemV554p9dPLvjUq229U1qMkl9HUqcMx6e1vJfixOmZmZmYFOMkyMzMzK8BJlpmZmVkBTrLMzMzMCqhFw/d23AjRSvG+NX14WydN7EjkbWftDGJfHua+5ZosMzMzswKcZJmZmZkV4CTLzMzMrAAnWWZmZmYFOMkyMzMzK6C2vQutvE69NNyrZ3qrS++ddnGM+r5ZquybWG5NPD81rRdnncuyk6bF7JosMzMzswKcZJmZmZkV4CTLzMzMrAAnWWZmZmYF1LbhexMbPTZNqcbJJZdnE+t3m9RlO5WKo877bF3KvpRBNAx34/JmKLWdmlaerskyMzMzK6CvmixJi4BHgaeB5RExdxBBmZmZmTXdIC4X/kVE3DeA+ZiZmZmNDF8uNDMzMyug3yQrgB9KWiBp3iACMjMzMxsF/V4u3DEiFkt6CXCJpFsi4vLqBDn5SgnYnDldz7hpPQimK2+n+vE2Gd+we9WWUnI7l+qB6X1z6gy7V+2wewfXdd/qqyYrIhbn/8uA84Ht2kwzPyLmRsRcZs7sZ3FmZmZmjTHpJEvS6pLWHHsN7AbcOKjAzMzMzJqsn8uFs4DzJY3N59sR8R8DicrMzMys4SadZEXE7cBrBxiLmZmZ2cio7WN1rNn6bRhc10aMTeCyH5w6NHDvpGRDZu8Do2dUHlPVtH3T98kyMzMzK8BJlpmZmVkBTrLMzMzMCnCSZWZmZlbASDR8b9odYOtuEA0Zh132w258WWd1aOBqU2fU92+rl172t7p8V/f0fdHnslyTZWZmZlaAkywzMzOzApxkmZmZmRXgJMvMzMysACdZZmZmZgWMRO9C96YZrEGUZ7veG53mO+xea4PoiTgdezOOynrY6KlLrzUbX122R09x9Pn95JosMzMzswKcZJmZmZkV4CTLzMzMrAAnWWZmZmYFjETD91E3iEadg2hc3svySk3bSb/r12sMdWnAWcJ0bNRfF8PuBDIq26/O61GXx1HV+dE17dR5m/bCNVlmZmZmBfSVZEl6m6RfS7pN0uGDCsrMzMys6SadZElaEfgGsDuwJbCvpC0HFZiZmZlZk/VTk7UdcFtE3B4RfwTOAvYaTFhmZmZmzdZPkrUhcGfl/V15mJmZmdm0V7x3oaR5wLz89imkG0svc9R07KTRSy+wwQSyPnDfIGY1aH2vX016ABXU9bbrqShGv9yGapziLHPsefsVp1LbbhKBNGpx9dk3X9nPh/tJshYDG1feb5SHPU9EzAfmA0i6JiLm9rFMm0Lefs3lbdds3n7N5W3XbJKu6efz/Vwu/AWwuaSXSVoZeA9wYT/BmJmZmY2KSddkRcRySQcDPwBWBE6OiJsGFpmZmZlZg/XVJisiLgYu7uEj8/tZnk05b7/m8rZrNm+/5vK2a7a+tp8iRuTe9WZmZmY14sfqmJmZmRUwlCTLj99pFkkbS7pM0s2SbpJ0SB6+nqRLJN2a/6871bFae5JWlHSdpIvy+5dJujofg9/JnVWshiStI+kcSbdIWijpjT72mkPSJ/J580ZJZ0paxcdffUk6WdIyVW4v1el4U/K1vB1/Kel1E82/eJLlx+800nLgsIjYEtge+FjeZocDl0bE5sCl+b3V0yHAwsr7LwDHRcRmwIPAAVMSlXXjeOA/IuJVwGtJ29HHXgNI2hD4ODA3IrYidQp7Dz7+6uwU4G0twzodb7sDm+e/ecAJE818GDVZfvxOw0TEkoi4Nr9+lHSS35C03U7Nk50K7D0lAdq4JG0EvB34Zn4v4C3AOXkSb7uakrQ28CbgJICI+GNEPISPvSaZAawqaQawGrAEH3+1FRGXAw+0DO50vO0FnBbJVcA6kmaPN/9hJFl+/E6DSdoU2Aa4GpgVEUvyqHuAWVMVl43rq8AngWfy+xcDD0XE8vzex2B9vQy4F/jXfLn3m5JWx8deI0TEYuBLwO9JydXDwAJ8/DVNp+Ot53zGDd+tI0lrAOcCh0bEI9VxkbqlumtqzUjaE1gWEQumOhablBnA64ATImIb4HFaLg362Kuv3HZnL1KyvAGwOi+8FGUN0u/xNowkq6vH71i9SFqJlGCdERHn5cFLx6pG8/9lUxWfdbQD8FeSFpEuzb+F1MZnnXz5AnwM1tldwF0RcXV+fw4p6fKx1wy7Ar+LiHsj4k/AeaRj0sdfs3Q63nrOZ4aRZPnxOw2T2/CcBCyMiK9URl0I7J9f7w98d9ix2fgi4tMRsVFEbEo61n4cEe8DLgP+Jk/mbVdTEXEPcKeksYfS7gLcjI+9pvg9sL2k1fJ5dGz7+fhrlk7H24XAB3Ivw+2BhyuXFdsays1IJe1Baicy9vidY4ov1CZN0o7AT4Ff8Vy7niNI7bLOBuYAdwD7RERrg0GrCUk7A38fEXtKejmpZms94Drg/RHx1BSGZx1I2prUaWFl4HbgQ6QfxD72GkDSUcC7Sb20rwM+TGq34+OvhiSdCewMrA8sBT4DXECb4y0nzl8nXQJ+AvhQRIz7AGnf8d3MzMysADd8NzMzMyvASZaZmZlZAU6yzMzMzApwkmVmZmZWgJMsMzMzswKcZJmZmZkV4CTLzMzMrAAnWWZmZmYF/BfOStvVH9uIpAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(16, 30, 100)\n",
    "mask = create_subsequence_mask(t, r=.15) # default settings\n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'sample 0 subsequence mask (sync=False) - default mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[1], cmap='cool')\n",
    "plt.title(f'sample 1 subsequence mask (sync=False) - default mean: {mask[1].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(16, 30, 100)\n",
    "mask = create_subsequence_mask(t, r=.3) # 30% of values masked\n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'sample 0 subsequence mask (r=.3) mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(16, 30, 100)\n",
    "mask = create_subsequence_mask(t, lm=5) # average length of mask = 5 \n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'sample 0 subsequence mask (lm=5) mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(16, 30, 100)\n",
    "mask = create_subsequence_mask(t, stateful=False) # individual time steps masked \n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'per sample subsequence mask (stateful=False) mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(1, 30, 100)\n",
    "mask = create_subsequence_mask(t, sync=True) # all time steps masked simultaneously\n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'per sample subsequence mask (sync=True) mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(1, 30, 100)\n",
    "mask = create_variable_mask(t) # masked variables\n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'per sample variable mask mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(1, 30, 100)\n",
    "mask = create_future_mask(t, r=.15, sync=True) # masked steps\n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'future mask mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = torch.rand(1, 30, 100)\n",
    "mask = create_future_mask(t, r=.15, sync=False) # masked steps\n",
    "mask = create_future_mask(t, r=.15, sync=True) # masked steps\n",
    "test_eq(mask.dtype, torch.bool)\n",
    "plt.figure(figsize=(10, 3))\n",
    "plt.pcolormesh(mask[0], cmap='cool')\n",
    "plt.title(f'future mask mean: {mask[0].float().mean().item():.3f}')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#export\n",
    "def create_mask(o,  r=.15, lm=3, stateful=True, sync=False, subsequence_mask=True, variable_mask=False, future_mask=False):\n",
    "    if r <= 0 or r >=1: return torch.zeros_like(o).bool()\n",
    "    if int(r * o.shape[1]) == 0:\n",
    "        variable_mask = False \n",
    "    if subsequence_mask and variable_mask:\n",
    "        random_thr = 1/3 if sync == 'random' else 1/2\n",
    "        if random.random() > random_thr: \n",
    "            variable_mask = False\n",
    "        else:\n",
    "            subsequence_mask = False \n",
    "    elif future_mask:\n",
    "        return create_future_mask(o, r=r)\n",
    "    elif subsequence_mask:\n",
    "        return create_subsequence_mask(o, r=r, lm=lm, stateful=stateful, sync=sync)\n",
    "    elif variable_mask:\n",
    "        return create_variable_mask(o, r=r)\n",
    "    else:\n",
    "        raise ValueError('You need to set subsequence_mask, variable_mask or future_mask to True or pass a custom mask.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# export\n",
    "import matplotlib.colors as mcolors\n",
    "\n",
    "\n",
    "class MVP(Callback):\n",
    "    order = 60\n",
    "\n",
    "    def __init__(self, r: float = .15, subsequence_mask: bool = True, lm: float = 3., stateful: bool = True, sync: bool = False, variable_mask: bool = False,\n",
    "                 future_mask: bool = False, custom_mask: Optional = None, nan_to_num: int = 0, window_size: Optional[tuple] = None, dropout: float = .1,\n",
    "                 crit: callable = None, weights_path: Optional[str] = None, target_dir: str = './data/MVP', fname: str = 'model', save_best: bool = True,\n",
    "                 verbose: bool = False):\n",
    "        r\"\"\"\n",
    "        Callback used to perform the pretext task of reconstruct the original data after a binary mask has been applied.\n",
    "\n",
    "        Args:\n",
    "            r:                proba of masking.\n",
    "            subsequence_mask: apply a mask to random subsequences.\n",
    "            lm:               average mask len when using stateful (geometric) masking.\n",
    "            stateful:         geometric distribution is applied so that average mask length is lm.\n",
    "            sync:             all variables have the same masking.\n",
    "            variable_mask:    apply a mask to random variables. Only applicable to multivariate time series.\n",
    "            future_mask:      used to train a forecasting model.\n",
    "            custom_mask:      allows to pass any type of mask with input tensor and output tensor. Values to mask should be set to True.\n",
    "            nan_to_num:       integer used to fill masked values\n",
    "            window_size:      allows you to pass a fixed window size or tuple of window sizes to train MVP with on sequences of different length. \n",
    "                              You may pass int(s) or float(s).\n",
    "            dropout:          dropout applied to the head of the model during pretraining.\n",
    "            crit:             loss function that will be used. If None MSELossFlat().\n",
    "            weights_path:     indicates the path to pretrained weights. This is useful when you want to continue training from a checkpoint. It will load the\n",
    "                              pretrained weights to the model with the MVP head.\n",
    "            target_dir :      directory where trained model will be stored.\n",
    "            fname :           file name that will be used to save the pretrained model.\n",
    "            save_best:        saves best model weights\n",
    "    \"\"\"\n",
    "        assert subsequence_mask or variable_mask or future_mask or custom_mask, \\\n",
    "            'you must set (subsequence_mask and/or variable_mask) or future_mask to True or use a custom_mask'\n",
    "        if custom_mask is not None and (future_mask or subsequence_mask or variable_mask):\n",
    "            warnings.warn(\"Only custom_mask will be used\")\n",
    "        elif future_mask and (subsequence_mask or variable_mask):\n",
    "            warnings.warn(\"Only future_mask will be used\")\n",
    "        store_attr(\"subsequence_mask,variable_mask,future_mask,custom_mask,dropout,r,lm,stateful,sync,crit,weights_path,fname,save_best,verbose,nan_to_num\")\n",
    "        self.PATH = Path(f'{target_dir}/{self.fname}')\n",
    "        if not os.path.exists(self.PATH.parent):\n",
    "            os.makedirs(self.PATH.parent)\n",
    "        self.path_text = f\"pretrained weights_path='{self.PATH}.pth'\"\n",
    "        self.window_size = window_size\n",
    "\n",
    "    def before_fit(self):\n",
    "        self.run = not hasattr(self, \"gather_preds\")\n",
    "        if 'SaveModelCallback' in [cb.__class__.__name__ for cb in self.learn.cbs]:\n",
    "            self.save_best =  False # avoid saving if SaveModelCallback is being used\n",
    "        if not(self.run): return\n",
    "\n",
    "        # prepare to save best model\n",
    "        self.best = float('inf')\n",
    "\n",
    "        # modify loss for denoising task\n",
    "        self.old_loss_func = self.learn.loss_func\n",
    "        self.learn.loss_func = self._loss\n",
    "        if self.crit is None: \n",
    "            self.crit = MSELossFlat()\n",
    "        self.learn.MVP = self\n",
    "        self.learn.TSBERT = self\n",
    "\n",
    "        # remove and store metrics\n",
    "        self.learn.metrics = L([])\n",
    "\n",
    "        # change head with conv layer (equivalent to linear layer applied to dim=1)\n",
    "        assert hasattr(self.learn.model, \"head\"), \"model must have a head attribute to be trained with MVP\"\n",
    "        self.learn.model.head = nn.Sequential(nn.Dropout(self.dropout),\n",
    "                                              nn.Conv1d(self.learn.model.head_nf, self.learn.dls.vars, 1)\n",
    "                                             ).to(self.learn.dls.device)\n",
    "        if self.weights_path is not None:\n",
    "            transfer_weights(learn.model, self.weights_path, device=self.learn.dls.device, exclude_head=False)\n",
    "\n",
    "        with torch.no_grad():\n",
    "            xb = torch.randn(2, self.learn.dls.vars, self.learn.dls.len).to(self.learn.dls.device)\n",
    "            assert xb.shape == self.learn.model(xb).shape, 'the model cannot reproduce the input shape'\n",
    "            \n",
    "        if self.window_size:\n",
    "            if isinstance(self.window_size, float) or self.window_size == 1: \n",
    "                self.window_size = int(round(self.window_size * self.learn.dls.len))\n",
    "            elif is_listy(self.window_size): \n",
    "                self.window_size = list(self.window_size)\n",
    "                for i in range(len(self.window_size)):\n",
    "                    if isinstance(self.window_size[i], float) or self.window_size[i] == 1: \n",
    "                        self.window_size[i] = int(round(self.window_size[i] * self.learn.dls.len))\n",
    "        \n",
    "    def before_batch(self):\n",
    "        original_mask = torch.isnan(self.x)\n",
    "        if self.custom_mask is not None:\n",
    "            new_mask = self.custom_mask(self.x)\n",
    "        else:\n",
    "            new_mask = create_mask(self.x, r=self.r, lm=self.lm, stateful=self.stateful, sync=self.sync, subsequence_mask=self.subsequence_mask,\n",
    "                                   variable_mask=self.variable_mask, future_mask=self.future_mask).bool()\n",
    "        if original_mask.any(): \n",
    "            self.mask = torch.logical_and(new_mask, ~original_mask)\n",
    "        else: \n",
    "            self.mask = new_mask\n",
    "#         self.learn.yb = (torch.nan_to_num(self.x, self.nan_to_num),) # Only available in Pytorch 1.8\n",
    "        self.learn.yb = (torch_nan_to_num(self.x, self.nan_to_num),)\n",
    "        self.learn.xb = (self.yb[0].masked_fill(self.mask, self.nan_to_num), )\n",
    "        if self.window_size:\n",
    "            if is_listy(self.window_size): ws = np.random.randint(*self.window_size)\n",
    "            else: ws = self.window_size\n",
    "            w_start = np.random.randint(0, self.x.shape[-1] - ws)\n",
    "            self.learn.xb = (self.learn.xb[0][..., w_start:w_start+ws], )\n",
    "            self.learn.yb = (self.learn.yb[0][..., w_start:w_start+ws], )\n",
    "            self.mask = self.mask[..., w_start:w_start+ws]\n",
    "\n",
    "    def after_epoch(self):\n",
    "        val = self.learn.recorder.values[-1][-1]\n",
    "        if self.save_best:\n",
    "            if np.less(val, self.best):\n",
    "                self.best = val\n",
    "                self.best_epoch = self.epoch\n",
    "                torch.save(self.learn.model.state_dict(), f'{self.PATH}.pth')\n",
    "                pv(f\"best epoch: {self.best_epoch:3}  val_loss: {self.best:8.6f} - {self.path_text}\", self.verbose or (self.epoch == self.n_epoch - 1))\n",
    "            elif self.epoch == self.n_epoch - 1:\n",
    "                print(f\"\\nepochs: {self.n_epoch} best epoch: {self.best_epoch:3}  val_loss: {self.best:8.6f} - {self.path_text}\\n\")\n",
    "\n",
    "    def after_fit(self):\n",
    "        self.run = True\n",
    "\n",
    "    def _loss(self, preds, target):\n",
    "        return self.crit(preds[self.mask], target[self.mask])\n",
    "\n",
    "    def show_preds(self, max_n=9, nrows=3, ncols=3, figsize=None, sharex=True, **kwargs):\n",
    "        b = self.learn.dls.valid.one_batch()\n",
    "        self.learn._split(b)\n",
    "        self.learn('before_batch')\n",
    "        xb = self.xb[0].detach().cpu().numpy()\n",
    "        bs, nvars, seq_len = xb.shape\n",
    "        masked_pred = torch.where(self.mask, self.learn.model(*self.learn.xb), tensor([np.nan], device=self.learn.x.device))\n",
    "        masked_pred = masked_pred.detach().cpu().numpy()\n",
    "        ncols = min(ncols, math.ceil(bs / ncols))\n",
    "        nrows = min(nrows, math.ceil(bs / ncols))\n",
    "        max_n = min(max_n, bs, nrows*ncols)\n",
    "        if figsize is None:\n",
    "            figsize = (ncols*6, math.ceil(max_n/ncols)*4)\n",
    "        fig, ax = plt.subplots(nrows=nrows, ncols=ncols,\n",
    "                               figsize=figsize, sharex=sharex, **kwargs)\n",
    "        idxs = np.random.permutation(np.arange(bs))\n",
    "        colors = list(mcolors.TABLEAU_COLORS.keys()) + \\\n",
    "            random_shuffle(list(mcolors.CSS4_COLORS.keys()))\n",
    "        i = 0\n",
    "        for row in ax:\n",
    "            for col in row:\n",
    "                color_iter = iter(colors)\n",
    "                for j in range(nvars):\n",
    "                    try:\n",
    "                        color = next(color_iter)\n",
    "                    except:\n",
    "                        color_iter = iter(colors)\n",
    "                        color = next(color_iter)\n",
    "                    col.plot(xb[idxs[i]][j], alpha=.5, color=color)\n",
    "                    col.plot(masked_pred[idxs[i]][j],\n",
    "                             marker='o', markersize=4, linestyle='None', color=color)\n",
    "                i += 1\n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "        \n",
    "TSBERT = MVP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Experiments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[W ParallelNative.cpp:212] Warning: Cannot set number of intraop threads after parallel work has started or after set_num_threads call when using native parallel backend (function set_num_threads)\n",
      "[W ParallelNative.cpp:212] Warning: Cannot set number of intraop threads after parallel work has started or after set_num_threads call when using native parallel backend (function set_num_threads)\n"
     ]
    }
   ],
   "source": [
    "from fastai.data.transforms import *\n",
    "from tsai.data.all import *\n",
    "from tsai.models.utils import *\n",
    "from tsai.models.layers import *\n",
    "from tsai.learner import *\n",
    "from tsai.models.TSTPlus import *\n",
    "from tsai.models.InceptionTimePlus import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X      - shape: [1272 samples x 1 features x 84 timesteps]  type: memmap  dtype:float32  isnan: 0\n",
      "y      - shape: (1272,)  type: memmap  dtype:<U1  n_classes: 2 (636 samples per class) ['1', '2']  isnan: False\n",
      "splits - n_splits: 2 shape: [20, 1252]  overlap: False\n"
     ]
    }
   ],
   "source": [
    "dsid = 'MoteStrain'\n",
    "X, y, splits = get_UCR_data(dsid, split_data=False)\n",
    "check_data(X, y, splits, False)\n",
    "X[X<-1] = np.nan # This is to test the model works well even if nan values are passed through the dataloaders."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/nacho/opt/anaconda3/envs/py38/lib/python3.8/site-packages/torch/nn/init.py:388: UserWarning: Initializing zero-element tensors is a no-op\n",
      "  warnings.warn(\"Initializing zero-element tensors is a no-op\")\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1.111950</td>\n",
       "      <td>1.174239</td>\n",
       "      <td>00:13</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best epoch:   0  val_loss: 1.174239 - pretrained weights_path='data/MVP/MoteStrain.pth'\n"
     ]
    }
   ],
   "source": [
    "# Pre-train\n",
    "tfms  = [None, [Categorize()]]\n",
    "batch_tfms = [TSStandardize(by_var=True)]\n",
    "unlabeled_dls = get_ts_dls(X, splits=splits, tfms=tfms, batch_tfms=batch_tfms)\n",
    "learn = ts_learner(unlabeled_dls, InceptionTimePlus, cbs=[MVP(fname=f'{dsid}', window_size=(.5, 1))]) # trained on variable window size\n",
    "learn.fit_one_cycle(1, 3e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "weights from data/MVP/MoteStrain.pth successfully transferred!\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.534770</td>\n",
       "      <td>1.184634</td>\n",
       "      <td>00:16</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best epoch:   0  val_loss: 1.184634 - pretrained weights_path='data/MVP/model.pth'\n"
     ]
    }
   ],
   "source": [
    "learn = ts_learner(unlabeled_dls, InceptionTimePlus, cbs=[MVP(weights_path=f'data/MVP/{dsid}.pth')])\n",
    "learn.fit_one_cycle(1, 3e-3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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iIiIiIiIiKiFMUBIRERERERERETUwhggJCIiIiIiIiIiamFCSln7JxViEcB4BR6qC8BSBR6HdsbXufr4GtcGX+fqs/s13iel7C71iyq4LwH2vwatgK9xbfB1rj6+xtVn92tc1r4E8J6pAfF1rj6+xtXH17g27H6dC+5NtgQIK0UI8a6U8rTd62h2fJ2rj69xbfB1rj6+xnwNaoGvcW3wda4+vsbVx9eYr0Gt8HWuPr7G1cfXuDbq9XVmiTEREREREREREVELY4CQiIiIiIiIiIiohTV6gPCbdi+gRfB1rj6+xrXB17n6+BrzNagFvsa1wde5+vgaVx9fY74GtcLXufr4GlcfX+PaqMvXuaF7EBIREREREREREdHeNHoGIREREREREREREe0BA4REREREREREREQtjAFCIiIiIiIiIiKiFsYAIRERERERERERUQtjgJCIiIiIiIiIiKiFMUBIRERERERERETUwhggJCIiIiIiIiIiamEMEBIREREREREREbUwzY4n7erqkqOjo3Y8NRERNbH33ntvSUrZXerXcV8iIqJqKHdfArg3ERFRdWy3N9kSIBwdHcW7775rx1MTEVETE0KMl/N13JeIiKgayt2XAO5NRERUHdvtTSwxJiIiIiIiIiIiamEMEBIREREREREREbUwBgiJiIiIiIiIiIhaGAOERERERERERERELYwBQiIiIiIiIiIiohbGACEREREREREREVELY4CQiIiIiIiIiIiohTFASERERERERERE1MIYICQiIiIiIiIiImphDBASERFRXYilDdxeiNq9DCIiIiKilsMAIREREdWFy9NhvHhhFveW4nYvhYiIiIiopTBASERERHVBNy0AwG+uLyBjWDavhoiIiIiodTBASERERHXBtCSEACJJHW/dXbZ7OURERERELYMBQiIiIqoLpiXhdqh4eCiE9ydWsRBJ2b0kIiIiIqKWwAAhERER1QXTktAUgecOdcHrVPHLa/OwLGn3soiIiIiImh4DhERERFQXLCmhCAG3Q8VHjvZgIZLGuck1u5dFRERERNT0GCAkIiKiumBYEpoqAACHevw40O3Dm3eWEE7qNq+MiIiIiKi5MUBIREREdcG0shmEACCEwEeO9UA3Ja7PRmxeGRERERFRc2OAkIiIiOpCvgdhXtDtgMepIp4xbFwVEREREVHzY4CQiIiI6oJpSSgbAoQA4HOqiKdNm1ZERERERNQaGCAkIiKiurA1gxAAvE4NCWYQEhERERFVFQOEREREVBdMKaFuzSB0MYOQiIiIiKjaGCAkIiKiumBaDwYI8xmEUkqbVkVERERE1PwYICQiIqK6YFoSqngwg1A3JTKmZdOqiIiIiIiaHwOEREREVBe2yyAEgATLjImIiIiIqoYBQiIiIqoLhQKEvlyAMM5BJUREREREVcMAIREREdUFw5JQtmYQulQAQCLDDEIiIiIiomphgJCIiIjqgmVJaNtlEKaZQUhEREREVC0MEBIREZHtpJQwCgwpcTsUKEIwg5CIiIiIqIoYICQiIiLbWTL73609CIUQ8LlUZhASEREREVURA4RERERkO8OyADwYIASyk4yZQUhEREREVD0MEBIREZHtcvHBggFCn0vlFGMiIiIioipigJCIiIhsZ8psjfG2GYRpZhASEREREVULA4RERERkO9PcPkDoc6pIZExY+UaFRERERERUUQwQEhERke12zCB0abCkRMpgFiERERERUTUwQEhERES2yw8p0bbJIASAOMuMiYiIiIiqggFCIiIisl1+SIkiCmcQAkCCg0qIiIiIiKqCAUIiIiKy3f0MwgcvTZhBSERERERUXQwQEhERke3WMwgLXJl4ncwgJCIiIiKqpj0HCIUQbiHEWSHEBSHEFSHE/6MSCyMiIqLWsVMGoVNT4NQUxDPMICQiIiIiqgatAo+RBvBRKWVMCOEA8JoQ4qdSyrcq8NhERETUAqzcFONCGYQA4HWqSKSZQUhEREREVA17DhBKKSWAWO6Pjtz/5F4fl4iIiFqHYWUvHQplEAKAz6kxg5CIiIiIqEoq0oNQCKEKIc4DWADwSynl2wU+5xtCiHeFEO8uLi5W4mmJiIjKxn2pvpi5AKFaYIoxAHhdKuLMICSiJse9iYiI7FKRAKGU0pRSPgpgCMCTQohTBT7nm1LK01LK093d3ZV4WiIiorJxX6ov6wFCtXCAMJtByAAhETU37k1ERGSXik4xllKuAfgtgE9V8nGJiIioue2aQehUkdYtGKZVy2UREREREbWESkwx7hZCtOX+vwfACwCu7/VxiYiIqHXkA4TbDSnxubJtk9mHkIiIiIio8ioxxbgfwN8KIVRkA47/IqX8cQUel4iIiFqEucuQEq9TBQAkMgZCHkfN1kVERERE1AoqMcX4IoDHKrAWIiIialHrGYSFK4zvZxCmmUFIRERERFRpFe1BSERERFQOU0poioDYoQchkM0gJCIiIiKiymKAkIiIiGxnWBLKdumDALxOZhASEREREVULA4RERERkO8vKZhBuR1UEPE6VGYRERERERFXAACERERHZzrQk1B0ChADgc6qcYkxEREREVAUMEBIREZHtigkQep0aEmlmEBIRERERVRoDhERERGQ7UxaRQehiBiERERERUTUwQEhERES2K6rE2JXNIJRS1mhVREREREStgQFCIiIisp1pSahi9xJjw5JIG1aNVkVERERE1BoYICQiIiLbGUVlEKoAgATLjImIiIiIKooBQiIiIrKdVdQUYw0AEOegEiIiIiKiimKAkIiIiGxXTAah18kMQiIiIiKiamCAkIiIiGxnFTXFOJdBmGEGIRERERFRJTFASERERLYzTAltlwChS1OgKgKJNDMIiYiIiIgqiQFCIiIisp0lJZRdphgLIeB1qswgJCIiIiKqMAYIiYiIyHaGJaGpOwcIgWyZcYIBQiIiIiKiimKAkIiIiGxnWrtnEALZQSVxlhgTEREREVUUA4RERERkO7OIKcYA4HNqiKeZQUhEREREVEkMEBIREZGtpJRFBwi9LhVJ3YRlyRqsjIiIiIioNTBASERERLYyc8E+tYgSY59Tg5RAQmeZMRERERFRpTBASERERLYyZTZAWOyQEgAsMyYiIiIiqiAGCJtASjfxs8uznOpIREQNybKy/y1mSInPpQJggJCIiIiIqJIYIGwCU6sJXJuNYmwpYfdSiIiISmbkIoSasvtlyf0MQpYYExERERFVCgOETWA5lgEArCUyNq+EiIiodOsZhEVclficuQAhs+aJiIiIiCqGAcImsBzPBgZXE7rNKyEiIipdKRmEqiLgcaosMSYiIiIiqiAGCJvA/QAhMwiJiKjx5IeUqEVelfhcGuIZlhgTEREREVUKA4QNzrIkVuP3S4xl7iaLiIioUZhWPkBY3GWJjxmEREREREQVxQBhg1tL6jAtib6QG7opEeMNExERNZj1AGERU4yBXAYh9zsiIiIioophgLDBrcTTAIBDPX4AwBr7EBIRUYNZDxCqRQYInRoSGZNZ80REREREFcIAYYPLTzA+0OUDwD6ERETUeErPIFRhWhJJnX0IiYiIiIgqgQHCBrcSzyDo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\n",
      "text/plain": [
       "<Figure size 1296x864 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.MVP.show_preds(sharey=True) # these preds are highly inaccurate as the model's been trained for just 1 epoch for testing purposes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "weights from data/MVP/MoteStrain.pth successfully transferred!\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.834448</td>\n",
       "      <td>0.736260</td>\n",
       "      <td>0.460863</td>\n",
       "      <td>00:17</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Fine-tune\n",
    "tfms  = [None, [Categorize()]]\n",
    "batch_tfms = [TSStandardize(by_var=True), Nan2Value()]\n",
    "labeled_dls = get_ts_dls(X, y, splits=splits, tfms=tfms, batch_tfms=batch_tfms, bs=64)\n",
    "learn = ts_learner(labeled_dls, InceptionTimePlus, pretrained=True, weights_path=f'data/MVP/{dsid}.pth', metrics=accuracy)\n",
    "learn.fit_one_cycle(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/42/4hhwknbd5kzcbq48tmy_gbp00000gn/T/ipykernel_26448/547766861.py:40: UserWarning: Only future_mask will be used\n",
      "  warnings.warn(\"Only future_mask will be used\")\n",
      "/Users/nacho/opt/anaconda3/envs/py38/lib/python3.8/site-packages/torch/nn/init.py:388: UserWarning: Initializing zero-element tensors is a no-op\n",
      "  warnings.warn(\"Initializing zero-element tensors is a no-op\")\n"
     ]
    }
   ],
   "source": [
    "tfms  = [None, [Categorize()]]\n",
    "batch_tfms = [TSStandardize(by_var=True), Nan2Value()]\n",
    "unlabeled_dls = get_ts_dls(X, splits=splits, tfms=tfms, batch_tfms=batch_tfms, bs=64)\n",
    "fname = f'{dsid}_test'\n",
    "mvp = MVP(subsequence_mask=True, sync='random', variable_mask=True, future_mask=True, fname=fname)\n",
    "learn = ts_learner(unlabeled_dls, InceptionTimePlus, metrics=accuracy, cbs=mvp) # Metrics will not be used!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/42/4hhwknbd5kzcbq48tmy_gbp00000gn/T/ipykernel_26448/547766861.py:38: UserWarning: Only custom_mask will be used\n",
      "  warnings.warn(\"Only custom_mask will be used\")\n"
     ]
    }
   ],
   "source": [
    "tfms  = [None, [Categorize()]]\n",
    "batch_tfms = [TSStandardize(by_var=True)]\n",
    "unlabeled_dls = get_ts_dls(X, splits=splits, tfms=tfms, batch_tfms=batch_tfms, bs=64)\n",
    "fname = f'{dsid}_test'\n",
    "mvp = MVP(subsequence_mask=True, sync='random', variable_mask=True, future_mask=True, custom_mask=partial(create_future_mask, r=.15),\n",
    "                fname=fname)\n",
    "learn = ts_learner(unlabeled_dls, InceptionTimePlus, metrics=accuracy, cbs=mvp) # Metrics will not be used!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#hide\n",
    "from tsai.imports import create_scripts\n",
    "from tsai.export import get_nb_name\n",
    "nb_name = get_nb_name()\n",
    "create_scripts(nb_name);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
